import { app, shell, BrowserWindow, ipcMain } from 'electron'
import { join } from 'path'
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
import icon from '@resources/imgs/icon.png?asset'
import { setupIPC } from './ipc'

// 声明全局变量用于存储主窗口实例
let window1

function createWindow() {
    // 创建浏览器窗口。
    const mainWindow = new BrowserWindow({
        width: 900,
        height: 670,
        show: false,
        autoHideMenuBar: true,
        frame: false, // 移除官方标题栏
        ...(process.platform === 'linux' ? { icon } : {}),
        webPreferences: {
            preload: join(__dirname, '../preload/index.js'),
            sandbox: false
        }
    })

    mainWindow.on('ready-to-show', () => {
        mainWindow.show()
    })

    // 处理窗口打开事件，防止外部链接打开浏览器
    mainWindow.webContents.setWindowOpenHandler((details) => {
        shell.openExternal(details.url)
        return { action: 'deny' }
    })

    // 基于 electron-vite cli 的渲染器 HMR。
    // 开发环境加载远程 URL，生产环境加载本地 HTML 文件。
    if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
        mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
    } else {
        mainWindow.loadFile(join(__dirname, '../renderer/index.html'))
    }

    // 存储主窗口实例
    window1 = mainWindow
}

// 当 Electron 完成初始化并准备创建浏览器窗口时，将调用此方法。
// 某些 API 只能在此事件发生后使用。
app.whenReady().then(() => {
    // 为 Windows 设置应用程序用户模型 ID
    electronApp.setAppUserModelId('com.electron')

    // 在开发环境中默认通过 F12 打开或关闭 DevTools
    // 并在生产环境中忽略 CommandOrControl + R。
    // 详见 https://github.com/alex8088/electron-toolkit/tree/master/packages/utils
    app.on('browser-window-created', (_, window) => {
        optimizer.watchWindowShortcuts(window)
    })

    // 创建窗口
    createWindow()

    // 设置 IPC 通信
    setupIPC()

    app.on('activate', function () {
        // 在 macOS 上，当 Dock 图标被点击且没有其他窗口打开时，通常会重新创建一个窗口。
        if (BrowserWindow.getAllWindows().length === 0) createWindow()
    })
})

// 当所有窗口都关闭时退出应用程序，macOS 除外。在 macOS 上，应用程序及其菜单栏通常会保持活动状态，直到用户通过 Cmd + Q 明确退出。
app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') {
        app.quit()
    }
})

// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.
